import { Injectable, UploadedFile } from '@nestjs/common';
import { CreateFileoperationDto } from "./dto/create-fileoperation.dto";
import { UpdateFileoperationDto } from "./dto/update-fileoperation.dto";
import { Logger, Body } from '@nestjs/common';
import * as OSS from 'ali-oss';
import * as path from 'path';
import * as fs from 'fs';

const client: any = new OSS({
  // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: 'LTAI5tG2mpzUdQr181QZtvnj',
  accessKeySecret: 'HZUCcti7hNIMTWzzD1BmmYMPN983rJ',
  // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
  region: 'oss-cn-beijing',
  // yourBucketName填写Bucket名称。
  bucket: 'tech-standard',
});

@Injectable()
export class FileoperationService {

  private readonly logger = new Logger(FileoperationService.name);
  client: any;
  // 文件上传
  // uploadFile(Body: any) {
  //   this.logger.log('文件上传:' + Body);
  //   return '文件上传';
  // }
  // 查看文件列表
  async fileList(name: string, pageNum: number): Promise<any> {
    this.logger.log('文件查看执行');

    const pageSize = 100; // 每页显示的数量
    const marker = (pageNum - 1) * pageSize; // 计算marker

    let result;
    try {
      result = await client.list({
        prefix: '', // 可以根据需要设置前缀
        delimiter: '',
        maxKeys: pageSize,
        marker: String(marker),
        'encoding-type': 'url',
      });
      console.log(result.objects);
      

      if (name) {
        // 过滤出包含关键词的文件
        result.objects = result.objects.filter(obj => obj.name.includes(name));
      }

      console.log(result);
      this.logger.log('文件查看:' + JSON.stringify(result));
    } catch (error) {
      this.logger.error('文件查看失败:', error);
      throw error;
    }

    return result.objects;
  }

  // async fileList() {
  //   this.logger.log('文件查看执行');
  //   // 不带任何参数，默认最多返回100个文件。
  //   const result = await client.list();
  //   console.log(result);
  //   this.logger.log('文件查看:' + result);
  //   return  result ;

  // }
  //查看存储空间列表
  async listBuckets() {
    try {
      // 列举当前账号所有地域下的存储空间。
      const result = await client.listBuckets();
      console.log(result);
      return result;
    } catch (err) {
      console.log(err);
    }
  }

  // 上传文件
  async uploadFile(@UploadedFile() file) {
    console.log("upload:", file);

    const filename = file.originalname;
    // 自定义请求头
    const headers = {
      // 指定Object的存储类型。
      'x-oss-storage-class': 'Standard',
      // 指定Object的访问权限。
      'x-oss-object-acl': 'private',
      // 通过文件URL访问文件时，指定以附件形式下载文件，下载后的文件名称定义为example.txt。
      'Content-Disposition': `attachment; filename="${filename}"`,
      // 设置Object的标签，可同时设置多个标签。
      'x-oss-tagging': 'Tag1=1&Tag2=2',
      // 指定PutObject操作时是否覆盖同名目标Object。此处设置为true，表示禁止覆盖同名Object。
      'x-oss-forbid-overwrite': 'true',
    };

    try {
      // 直接从file.buffer获取Buffer数据
      const result = await client.put(filename, file.buffer, { headers });

      console.log(result);
      return result;
    } catch (e) {
      console.error('Error uploading file:', e);
      return {
        error: '文件上传失败',
        message: e,
      }
      throw e;
    }
  }
  // 上传多文件
  async uploadFiles(file,filename) {
    console.log("upload:", file);

    // 自定义请求头
    const headers = {
      // 指定Object的存储类型。
      'x-oss-storage-class': 'Standard',
      // 指定Object的访问权限。
      'x-oss-object-acl': 'private',
      // 通过文件URL访问文件时，指定以附件形式下载文件，下载后的文件名称定义为example.txt。
      'Content-Disposition': 'attachment; filename=' + encodeURIComponent(filename),
      // 设置Object的标签，可同时设置多个标签。
      'x-oss-tagging': 'Tag1=1&Tag2=2',
      // 指定PutObject操作时是否覆盖同名目标Object。此处设置为true，表示禁止覆盖同名Object。
      'x-oss-forbid-overwrite': 'true',
      'Content-Language': 'zh-CN',
    };

    try {
      // 直接从file.buffer获取Buffer数据
      const result = await client.put(filename, file, { headers });

      console.log(result);
      return result;
    } catch (e) {
      console.error('Error uploading file:', e);
      return {
        error: '文件上传失败',
        message: e,
      }
      throw e;
    }
  }
  async uploadMultipleFiles(files: Express.Multer.File[],type) {
    // 分清类型 type=1为标准查询，type=2为论文查询
    if(type==1){
      client.useBucket('tech-standard');
    }else if(type==2){
      client.useBucket('tech-paper');
    }else{
      return {
        code: 500,
        error: '文件上传失败',
        message: '服务器type参数错误',
      }
    }
    const results = [];

    for (const file of files) {
      const filename = file.originalname; // 或者你可以根据需要生成新的文件名
      try {
        const result = await this.uploadFiles(file.buffer, filename);
        results.push(result);
      } catch (e) {
        console.error(`Error uploading file ${filename}:`, e);
        results.push({ error: e.message, filename });
      }
    }

    return results;
  }
  // 下载文件
  async get() {
    try {
      // 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
      // 如果指定的本地文件存在会覆盖，不存在则新建。
      // 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
      const result = await client.get('证书.jpg', 'D:\\zzz.jpg');
      console.log(result);
      return result;
    } catch (e) {
      console.log(e);
    }
  }
  // 删除文件
  async deleteObject() {
    try {
      // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
      const result = await client.delete('头像.jpg');
      console.log(result);
      return result;
    } catch (error) {
      console.log(error);
    }
  }


  create(createFileoperationDto: CreateFileoperationDto) {
    return "This action adds a new fileoperation";
  }

  findAll() {
    return `This action returns all fileoperation`;
  }

  findOne(id: number) {
    return `This action returns a #${id} fileoperation`;
  }

  update(id: number, updateFileoperationDto: UpdateFileoperationDto) {
    return `This action updates a #${id} fileoperation`;
  }

  remove(id: number) {
    return `This action removes a #${id} fileoperation`;
  }
}
